import { http } from "@/utils/http";

/** 统一响应格式 */
export interface ApiResponse<T = any> {
  /** 状态码 */
  code: number;
  /** 响应消息 */
  message: string;
  /** 响应数据 */
  data?: T;
  /** 时间戳 */
  timestamp?: number;
}

/** 评论图片信息 */
export interface CommentImageInfo {
  /** 图片ID */
  id: number;
  /** 文件名 */
  fileName: string;
  /** 原始文件名 */
  originalName: string;
  /** 文件大小（字节） */
  fileSize: number;
  /** 文件类型 */
  contentType: string;
  /** 相对路径 */
  relativePath: string;
  /** 文件访问URL */
  fileUrl: string;
  /** 图片宽度 */
  width: number;
  /** 图片高度 */
  height: number;
  /** 排序顺序 */
  sortOrder?: number;
  /** 上传时间 */
  uploadTime: number;
}

/** 图片上传响应 */
export interface CommentImageUploadResponse {
  /** 是否成功 */
  success: boolean;
  /** 响应消息 */
  message: string;
  /** 上传令牌 */
  uploadToken: string;
  /** 临时图片ID */
  tempImageId: number;
  /** 图片信息 */
  imageInfo: CommentImageInfo;
}

/** 创建带图片的评论请求 */
export interface CreateCommentWithImagesRequest {
  /** 文章ID */
  articleId: number;
  /** 父评论ID */
  parentId?: number;
  /** 评论内容 */
  content: string;
  /** 临时图片ID列表 */
  tempImageIds?: number[];
  /** 上传令牌列表 */
  uploadTokens?: string[];
}

/** 带图片的评论响应 */
export interface CommentWithImagesResponse {
  /** 评论ID */
  id: number;
  /** 文章ID */
  articleId: number;
  /** 评论内容 */
  content: string;
  /** 用户信息 */
  user: {
    userId: number;
    userName: string;
    nickName: string;
    avatar: string;
  };
  /** 图片列表 */
  images: CommentImageInfo[];
  /** 图片数量 */
  imageCount: number;
  /** 创建时间 */
  createTime: string;
}

// ==================== API接口函数 ====================

/** 生成上传令牌 */
export const generateUploadTokenApi = () => {
  return http.request<ApiResponse<string>>(
    "post",
    "/api/comments/generate-upload-token"
  );
};

/** 上传评论图片 */
export const uploadCommentImageApi = (file: File, uploadToken?: string) => {
  const formData = new FormData();
  formData.append("file", file);
  if (uploadToken) {
    formData.append("uploadToken", uploadToken);
  }

  return http.request<ApiResponse<CommentImageUploadResponse>>(
    "post",
    "/api/comments/upload-image",
    {
      data: formData,
      headers: {
        "Content-Type": "multipart/form-data"
      }
    }
  );
};

/** 获取用户临时图片 */
export const getTempImagesApi = (uploadToken?: string) => {
  const params: any = {};
  if (uploadToken) {
    params.uploadToken = uploadToken;
  }

  return http.request<ApiResponse<CommentImageInfo[]>>(
    "get",
    "/api/comments/temp-images",
    { params }
  );
};

/** 创建带图片的评论 */
export const createCommentWithImagesApi = (
  data: CreateCommentWithImagesRequest
) => {
  return http.request<ApiResponse<CommentWithImagesResponse>>(
    "post",
    "/api/comments/create",
    { data }
  );
};

/** 批量获取评论图片列表 */
export const getBatchCommentImagesApi = (commentIds: number[]) => {
  return http.request<ApiResponse<Record<string, CommentImageInfo[]>>>(
    "post",
    "/api/comments/batch-images",
    { data: commentIds }
  );
};

/** 获取评论图片列表 (已废弃，使用批量接口替代) */
export const getCommentImagesApi = (commentId: number) => {
  // 使用批量接口替代单个接口
  return getBatchCommentImagesApi([commentId]).then(response => {
    if (response.code === 200 && response.data) {
      const images = response.data[commentId.toString()] || [];
      return {
        ...response,
        data: images
      };
    }
    return response as any;
  });
};

/** 删除评论图片 */
export const deleteCommentImageApi = (imageId: number) => {
  return http.request<ApiResponse>("delete", `/api/comments/images/${imageId}`);
};

/** 验证图片文件 */
export const validateImageApi = (file: File) => {
  const formData = new FormData();
  formData.append("file", file);

  return http.request<ApiResponse<boolean>>(
    "post",
    "/api/comments/validate-image",
    {
      data: formData,
      headers: {
        "Content-Type": "multipart/form-data"
      }
    }
  );
};

// ==================== 工具函数 ====================

/** 评论图片工具类 */
export class CommentImageUtils {
  /** 支持的图片格式 */
  static readonly SUPPORTED_FORMATS = [
    "image/jpeg",
    "image/jpg",
    "image/png",
    "image/gif",
    "image/webp"
  ];

  /** 最大文件大小（10MB） */
  static readonly MAX_FILE_SIZE = 10 * 1024 * 1024;

  /** 每条评论最多图片数量 */
  static readonly MAX_IMAGES_PER_COMMENT = 9;

  /** 验证图片文件 */
  static validateImageFile(file: File): { valid: boolean; message?: string } {
    // 检查文件类型
    if (!this.SUPPORTED_FORMATS.includes(file.type)) {
      return {
        valid: false,
        message: "不支持的图片格式，请上传 JPG、PNG、GIF 或 WebP 格式的图片"
      };
    }

    // 检查文件大小
    if (file.size > this.MAX_FILE_SIZE) {
      return {
        valid: false,
        message: `图片大小不能超过 ${this.formatFileSize(this.MAX_FILE_SIZE)}`
      };
    }

    return { valid: true };
  }

  /** 格式化文件大小 */
  static formatFileSize(bytes: number): string {
    if (bytes === 0) return "0 B";

    const k = 1024;
    const sizes = ["B", "KB", "MB", "GB"];
    const i = Math.floor(Math.log(bytes) / Math.log(k));

    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
  }

  /** 生成图片预览URL */
  static generatePreviewUrl(file: File): string {
    return URL.createObjectURL(file);
  }

  /** 释放预览URL */
  static revokePreviewUrl(url: string): void {
    URL.revokeObjectURL(url);
  }

  /** 检查图片数量限制 */
  static checkImageLimit(
    currentCount: number,
    newCount: number
  ): { valid: boolean; message?: string } {
    const totalCount = currentCount + newCount;

    if (totalCount > this.MAX_IMAGES_PER_COMMENT) {
      return {
        valid: false,
        message: `每条评论最多只能上传 ${this.MAX_IMAGES_PER_COMMENT} 张图片`
      };
    }

    return { valid: true };
  }

  /** 格式化错误消息 */
  static formatErrorMessage(error: any): string {
    if (typeof error === "string") {
      return error;
    }

    if (error?.response?.data?.message) {
      return error.response.data.message;
    }

    if (error?.message) {
      return error.message;
    }

    return "操作失败，请稍后重试";
  }
}
